PLINQ (Parallel LINQ) LINQ এর একটি বৈশিষ্ট্য যা মাল্টি-থ্রেডিং ব্যবহার করে ডেটা প্রসেসিংকে দ্রুত এবং কার্যকরী করে তোলে। PLINQ ব্যবহার করলে, আপনি সমান্তরালভাবে (parallel) কোয়েরি পরিচালনা করতে পারেন, যার ফলে কোয়েরির পারফরম্যান্স উল্লেখযোগ্যভাবে বাড়ে, বিশেষত যখন বড় ডেটাসেটের উপর কাজ করা হয়।
তবে, PLINQ কোডে Exception Handling এর সাথে কিছু বিশেষ সতর্কতা অবলম্বন করা প্রয়োজন, কারণ যখন একাধিক থ্রেডে সমান্তরাল কোয়েরি কার্যকরী হয়, তখন একাধিক থ্রেডে একাধিক এক্সসেপশন ঘটতে পারে। PLINQ এ Exception Handling করার জন্য কিছু নির্দিষ্ট কৌশল এবং টেকনিকস রয়েছে।
PLINQ কোয়েরি সমান্তরালভাবে একাধিক থ্রেডে এক্সিকিউট হয়, এবং একাধিক এক্সসেপশন একসাথে ঘটতে পারে। যখন একাধিক এক্সসেপশন ঘটে, PLINQ AggregateException ফেলে। এটি একটি কোলেকশন যা একাধিক এক্সসেপশন ধারণ করতে পারে।
PLINQ কোয়েরি চালানোর সময় আপনি AggregateException ব্যবহার করে সমস্ত এক্সসেপশনগুলো ধরতে পারেন এবং সেগুলো একসাথে হ্যান্ডল করতে পারেন।
using System;
using System.Linq;
using System.Threading.Tasks;
public class Program
{
public static void Main()
{
var numbers = new int[] { 1, 2, 0, 4, 5 }; // 0 দ্বারা ডিভাইড হবে একটি ভ্যালু
try
{
// PLINQ কোয়েরি - এখানে divideByZero এক্সসেপশন ঘটবে
var result = numbers.AsParallel()
.Select(n => 10 / n)
.ToList(); // Exception ঘটলে এটি এক্সপ্লোড করবে
foreach (var num in result)
{
Console.WriteLine(num);
}
}
catch (AggregateException ex)
{
// একাধিক এক্সসেপশনগুলো এখানে ধরা হবে
Console.WriteLine("এক্সসেপশন ঘটেছে:");
foreach (var innerEx in ex.Flatten().InnerExceptions)
{
Console.WriteLine(innerEx.Message); // এক্সসেপশন মেসেজ দেখান
}
}
}
}
এখানে:
AsParallel()
ব্যবহার করে সমান্তরালভাবে ডেটা প্রসেস করা হচ্ছে।Select
এর মধ্যে 10 কে বিভক্ত করার সময় কোনো DivideByZeroException
ঘটলে, এটি একটি AggregateException ফেলে।catch (AggregateException ex)
ব্লক ব্যবহার করে একাধিক এক্সসেপশন হ্যান্ডল করা হয়েছে।আউটপুট:
এক্সসেপশন ঘটেছে:
Attempted to divide by zero.
এখানে ex.Flatten().InnerExceptions
ব্যবহার করে সমস্ত এক্সসেপশন একত্রে দেখানো হচ্ছে।
PLINQ-এ আপনি ContinueOnCapturedContext অপশনটি ব্যবহার করে কিভাবে এক্সসেপশনগুলোকে ম্যানেজ করবেন, তা নির্ধারণ করতে পারেন। এটা বিশেষ করে UI থ্রেডে (যেমন Windows Forms বা WPF) Exception Handling এর সময় ব্যবহৃত হয়। এই অপশনটি ব্যবহার করলে, PLINQ প্রয়োগের সময় থ্রেড কনটেক্সট রক্ষা করে এবং UI থ্রেডে ফিরে এসে এক্সসেপশন হ্যান্ডল করতে সাহায্য করে।
var numbers = new int[] { 1, 2, 0, 4, 5 };
try
{
var result = numbers.AsParallel()
.WithExecutionMode(ParallelExecutionMode.ForceParallel)
.Select(n => 10 / n)
.ToList();
}
catch (AggregateException ex)
{
foreach (var innerEx in ex.Flatten().InnerExceptions)
{
Console.WriteLine(innerEx.Message);
}
}
এটি PLINQ কোয়েরি চলাকালীন একাধিক থ্রেডে একাধিক এক্সসেপশন সমর্থন করে এবং AggregateException
দিয়ে সমস্ত এক্সসেপশনকে একত্রে ধরে।
PLINQ কোয়েরি চালানোর সময় যদি আপনি চান যে প্রতিটি পৃথক থ্রেডের মধ্যে এক্সসেপশন হ্যান্ডলিং করা হোক, তবে আপনি Try-Catch ব্লক ব্যবহার করে কোয়েরির মধ্যে এক্সসেপশন হ্যান্ডল করতে পারেন।
using System;
using System.Linq;
public class Program
{
public static void Main()
{
var numbers = new int[] { 1, 2, 0, 4, 5 };
var result = numbers.AsParallel()
.Select(n =>
{
try
{
return 10 / n;
}
catch (Exception ex)
{
Console.WriteLine($"Error processing {n}: {ex.Message}");
return 0; // Default value in case of error
}
})
.ToList();
foreach (var num in result)
{
Console.WriteLine(num); // Will print 0 for the zero division case
}
}
}
এখানে:
n = 0
হয়, তখন DivideByZeroException
ধরা হবে এবং একটি ডিফল্ট মান (যেমন 0
) রিটার্ন করা হবে।আউটপুট:
Error processing 0: Attempted to divide by zero.
10
5
0
2
2
এখানে, 0
দিয়ে বিভাজন ঘটানোর কারণে Error processing 0 মেসেজ দেখা যাচ্ছে এবং অন্যান্য সঠিক রেজাল্ট দেখা যাচ্ছে।
PLINQ কোয়েরি চালানোর সময় একাধিক এক্সসেপশন ঘটতে পারে, যা AggregateException দ্বারা সংকলিত হয়। একাধিক এক্সসেপশন হ্যান্ডলিং করার জন্য try-catch ব্লক এবং AggregateException
ব্যবহার করা গুরুত্বপূর্ণ। PLINQ এর সাথে exception handling করতে হলে কিছু কৌশল অনুসরণ করতে হবে, যেমন Exception Flattening, UI Thread Handling এবং individual thread exception handling।
common.read_more